home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / sbin / update-gconf-defaults < prev    next >
Encoding:
Text File  |  2007-03-06  |  3.3 KB  |  136 lines

  1. #! /usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. #
  4. # ┬⌐ 2005 Josselin Mouette <joss@debian.org>
  5. # Licensed under the GNU LGPL, see /usr/share/common-licenses/LGPL-2.1
  6.  
  7.  
  8. defaults_dir = '/usr/share/gconf/defaults'
  9. outdir = '/var/lib/gconf/debian.defaults'
  10. treefile = '%gconf-tree.xml'
  11.  
  12. import os,tempfile,shutil,sys
  13.  
  14. if os.geteuid():
  15.   sys.stderr.write("%s needs to be run as root.\n"%sys.argv[0])
  16.   sys.exit(1)
  17.  
  18. tmp_dir=tempfile.mkdtemp(prefix="gconf-")
  19. tmp_home=tmp_dir+'/home'
  20. tmp_gconf=tmp_dir+'/gconf'
  21. tmp_file=tmp_dir+'/temp.entries'
  22.  
  23. save_stdout=os.dup(1)
  24. os.close(1)
  25.  
  26. def cleanup():
  27.   os.dup2(save_stdout,1)
  28.   os.close(save_stdout)
  29.   shutil.rmtree(tmp_dir)
  30.  
  31. def htmlescape(str):
  32.   return str.replace('&','&').replace('>','>').replace('<','<').replace('"','"')
  33.  
  34. def int_entry(value):
  35.   return '  <int>' + value + '</int>\n'
  36.  
  37. def bool_entry(value):
  38.   return '  <bool>' + value + '</bool>\n'
  39.  
  40. def float_entry(value):
  41.   return '  <float>' + value + '</float>\n'
  42.  
  43. def string_entry(value):
  44.   return '  <string>' + htmlescape(value) + '</string>\n'
  45.  
  46. def list_entry(value):
  47.   ret = '  <list type="string">\n'
  48.   for v in value[1:-1].split(','):
  49.     ret += '    <value><string>' + htmlescape(v) + '</string></value>\n'
  50.   ret += '  </list>\n'
  51.   return ret
  52.  
  53.  
  54. def listcmp(a,b):
  55.   """Number of starting similar elements in a and b"""
  56.   m = min(len(a),len(b))
  57.   for i in range(m):
  58.     if a[i] != b[i]:
  59.       return i
  60.   return m
  61.  
  62. def apply_entries(filename):
  63.   res=os.spawnvpe(os.P_WAIT,'gconftool-2',
  64.            ['gconftool-2','--direct','--config-source',
  65.             'xml:merged:'+tmp_gconf,'--load',filename],
  66.            {'HOME': tmp_home})
  67.   if res:
  68.     cleanup()
  69.     sys.exit(res)
  70.  
  71. gconf_val = {}
  72.  
  73. def write_and_apply_entries(filename):
  74.   out=file(filename,'w')
  75.   out.write('<gconfentryfile>\n<entrylist base="/">\n')
  76.   for key in gconf_val:
  77.     out.write('<entry>\n<key>' + key + '</key>\n<value>\n')
  78.     # write the current entry
  79.     value = gconf_val[key]
  80.     if value[0] == '"' and value[-1] == '"':
  81.       out.write(string_entry(value[1:-1]))
  82.     elif value in ['true','false']:
  83.       out.write(bool_entry(value))
  84.     elif value[0] == '[' and value[-1] == ']':
  85.       out.write(list_entry(value))
  86.     elif value.isdigit():
  87.       out.write(int_entry(value))
  88.     else:
  89.       try:
  90.         float(value)
  91.         out.write(float_entry(value))
  92.       except ValueError:
  93.         out.write(string_entry(value))
  94.     out.write('</value>\n</entry>\n')
  95.   out.write('</entrylist>\n</gconfentryfile>\n')
  96.   out.close()
  97.   apply_entries(filename)
  98.  
  99. def read_entries(filename):
  100.   for line in file(filename):
  101.     l = line.rstrip('\n').split(None,1)
  102.     if len(l) == 2:
  103.       gconf_val[l[0]] = l[1]
  104.  
  105.  
  106. defaults_files = os.listdir(defaults_dir)
  107. defaults_files.sort()
  108. for f in defaults_files:
  109.   realname=defaults_dir+'/'+f
  110.   if f.endswith('.dpkg-tmp'):
  111.     pass
  112.   elif f.endswith('.entries'):
  113.     if gconf_val:
  114.       write_and_apply_entries(tmp_file)
  115.       gconf_val={}
  116.     apply_entries(realname)
  117.   else:
  118.     read_entries(realname)
  119. if gconf_val:
  120.   write_and_apply_entries(tmp_file)
  121.  
  122. try:
  123.   shutil.copyfile(tmp_gconf+'/'+treefile,outdir+'/'+treefile+'.tmp')
  124.   os.rename(outdir+'/'+treefile+'.tmp',outdir+'/'+treefile)
  125. except IOError:
  126.   # No %gconf-tree.xml file was created.
  127.   try:
  128.     os.remove(outdir+'/'+treefile)
  129.   except OSError:
  130.     # No existing file
  131.     pass
  132.  
  133. cleanup()
  134.  
  135. os.system('kill -s HUP `pidof gconfd-2` >/dev/null 2>&1')
  136.